package concurrencyCookBook.cyclicBarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
	 public static void main(String[] args) {
	        int N = 4;
	        CyclicBarrier barrier  = new CyclicBarrier(N);
	        for(int i=0;i<N;i++)
	            new Writer(barrier).start();
	    }
	    static class Writer extends Thread{
	    	/**
	    	 * 只有当指定数量的线程到达指定位置时,才执行下面的代码
	    	 */
	        private CyclicBarrier cyclicBarrier;
	        public Writer(CyclicBarrier cyclicBarrier) {
	            this.cyclicBarrier = cyclicBarrier;
	        }
	 
	        @Override
	        public void run() {
	        	System.out.println(cyclicBarrier.getParties()+"===Parties返回需要几个线程到达数");
	        	System.out.println(cyclicBarrier.getNumberWaiting()+"===NumberWaiting返回等待数");
	        	System.out.println(cyclicBarrier.isBroken()+"判断是否被损坏");
	            System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
	            try {
	            	//cyclicBarrier.reset(); //所有等待的线程都会收到一个broken状态,如果一个线程被中断,
	            	//那么这个线程会收到一个中断状态,其他等待线程会收到一个broken状态
	                Thread.sleep(5000);      //以睡眠来模拟写入数据操作
	                System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕，等待其他线程写入完毕");
	                cyclicBarrier.await();
	            } catch (InterruptedException e) {
	                e.printStackTrace();
	            }catch(BrokenBarrierException e){
	                e.printStackTrace();
	            }
	            System.out.println("所有线程写入完毕，继续处理其他任务...");
	        }
	    }
}
